
#pragma once

namespace atr {

/**
 * @brief Namespace only for internal use of atr library
 * @details Please don't use this namespace outside the atr library. IF you REALLY need to - do it with special care.
 */
namespace __ {

template <typename Type>
    struct __push;

template <template <class ...> class Base, class ... Types>
struct __push<Base<Types...>>
{
    template <class ... NewTypes>    // list only
    using push_front = Base<NewTypes..., Types...>;

    template <class ... NewTypes>
    using push_back = Base<Types..., NewTypes...>;
};

} // namespace __
} // namespace atr